from enum import Enum


class EPlatformCmd(Enum):
    """
    台体通讯命令字
    """
    # 多路服务器操作
    SERVER_CONNECT = "0101"  # 连接台体多路服务器
    SERVER_SERIAL_INIT = "0102"  # 初始化台体多路服务器串口
    SERVER_SERIAL_CLOSE = "0103"  # 关闭台体多路服务器串口
    SERVER_SERIAL_INIT_ADVANCED = "0104"  # 初始化台体多路服务器串口（高级）

    # 功率源操作
    POWER_SOURCE_RISE = "0201"  # 功率源升源（常用）
    POWER_SOURCE_RISE_ADVANCED = "0202"  # 功率源升源（高级）
    POWER_SOURCE_CLOSE = "0203"  # 功率源关源
    HARMONIC_WAVE_PARAM_SET = "0201"  # 设置谐波参数

    # 标准表操作
    DEVICE_DATA_READ = "0301"  # 读标准表数据
    DEVICE_SET = "0302"  # 设置标准表

    # 表位控制操作
    PLATFORM_POSITION_INIT = "0401"  # 初始化台体表位
    PLATFORM_REMOTE_SIGNAL_STATUS_GET = "0402"  # 得到台体遥信状态
    PLATFORM_REMOTE_SIGNAL_STATUS_SET = "0403"  # 设置台体遥信状态
    PLATFORM_REMOTE_CONTROL_STATUS_GET = "0404"  # 得到台体遥控状态
    PLATFORM_REMOTE_CONTROL_STATUS_SET = "0405"  # 设置台体遥控状态
    PLATFORM_PULSE_SET = "0406"  # 台体脉冲设置
    PLATFORM_PULSE_INPUT = "0407"  # 台体脉冲输出
    PLATFORM_PULSE_STOP_INPUT = "0408"  # 台体脉冲输出停止
    CURRENT_LOOP_RESET = "0409"  # 电流回路复位
    CURRENT_LOOP_BREAK = "040A"  # 电流回路断开
    CURRENT_LOOP_CLOSE = "040B"  # 电流回路闭合
    TERMINAL_RS485_STATUS_GET = "040C"  # 得到终端RS-485接入状态
    TERMINAL_RS485_STATUS_SET = "040D"  # 设置终端RS-485接入状态
    TIMING_ERROR_TEST_PARAM_SET = "0411"  # 计时误差测试参数设置
    TIMING_ERROR_TEST_STOP = "0412"  # 计时误差测试停止
    TIMING_ERROR_TEST_RESULT_QUERY = "0413"  # 计时误差测试结果查询

    # CT 回路控制
    CT_PRIMARY_SIDE_STATUS_CONTROL = "0501"  # CT一次侧状态控制
    CT_SECONDARY_SIDE_STATUS_CONTROL = "0502"  # CT二次侧状态控制
    CT_SECONDARY_SIDE_TURNS_RATIO_CONTROL = "0503"  # CT二次侧变比控制
    CT_CURRENT_LOOP_SWITCH = "0504"  # CT电流回路切换
    POWER_CONSUMPTION_TEST_STATUS_ENTER = "0505"  # 进入功耗测试状态
    POWER_CONSUMPTION_TEST_DATA_READ = "0506"  # 读取功耗测试数据
    GROUND_TEST_ENTER = "0507"  # 进入接地故障试验
    PLATFORM_MAGENT_CONTROL = "0508"  # 台体磁铁控制
    EACH_DEVICE_ID_READ = "0510"  # 读各表位模块ID
    TERMINAL_PRIMARY_SIDE_CONTROL_STATUS = "0511"  # 设置终端一次侧控制状态
    TERMINAL_SECONDARY_SIDE_CONTROL_STATUS = "0512"  # 设置终端二次侧控制状态
    TERMINAL_SECONDARY_SIDE_IMPEDANCE_CONTROL = "0513"  # 设置终端二次侧阻抗控制
    CT_CURRENT_LOOP_SWITCH2 = "05014"  # CT电流回路切换

    # 其他操作
    SEND_TERMINAL_PROTOCOL_DATA = "1001"  # 给各表位终端发送规约数据
    READ_SIMULATE_PROTOCOL_DATA = "1002"  # 各表位终端抄读模拟电表数据
    READ_SIMULATE_DATA = "1003"  # 读模拟电表数据
    WRITE_SIMULATE_DATA = "1004"  # 写模拟电表数据

    SERVER_SERIAL_INIT_G = "0106"  # 初始化台体多路服务器串口
    SEND_PROTOCOL_DATA = "1007"  # 给各表位发送规约数据

    # TODO 可能的扩展
    SET_SIMULATE_PORT = "0415"
    """
    命令字：0415H
    功能描述：
        设置远端模拟设备端口
    发送数据 data 内容：
        端口号
        【说明：端口号: 检测软件映射的逆变器服务端口】
    返回数据 data 内容：
        null
    举例：
        发送: cmd=0415,data=1;10001   （表位 1 对应的模拟设备端口为 10001）
        接收: cmd=0415,ret=0,data=null
    """
    SEND_SIMULATE_DATA = "FF01"
    """
    命令字：FF01H（由多路服务器请求，检测软件（逆变器）响应）
    功能描述：
        发送 MODBUS 数据到模拟设备
    发送数据 data 内容：
        表位号;modbus数据
        【说明：表位号：1～16，对应台体的各表位】
        【说明：modbus数据: 协议转换器转换后的modbus数据】
    返回数据 data 内容：
        表位号;modbus数据
        【说明：表位号：1～16，对应台体的各表位】
        【说明：modbus数据: 逆变器响应的modbus数据】
    举例：
        发送: cmd=FF01,data=1;01040bd90006a3d7   （表位 1 发送的modbus数据01040bd90006a3d7）
        接收: cmd=0415,ret=0,data=1;01040bd90006a3d7
    """


class ESerialType(Enum):
    """
    串口类型枚举
    """
    TYPE_232 = 0
    TYPE_485_1 = 1
    TYPE_485_2 = 2


class EProtocolType(Enum):
    """
    协议类型枚举
    """
    TYPE_645 = 0
    TYPE_376_1 = 1
    TYPE_698_45 = 2
    TYPE_376_2 = 4


class EConnectionMode(Enum):
    """
    接线方式枚举
    """
    MODE_PT4 = 0  # 三相四线有功
    MODE_QT4 = 1  # 三相四线无功
    MODE_P32 = 2  # 三相三线有功
    MODE_Q32 = 3  # 三相三线无功
    MODE_Q60 = 4
    MODE_Q33 = 5
    MODE_P = 7


class EPhasePosition(Enum):
    """
    相位枚举
    """
    Ua = 0
    Ub = 1
    Uc = 3
    Ib = 4
    Ic = 5


class EModeOutputRemoteControl(Enum):
    ELECTRICAL_LEVE = "00"
    ELECTRICAL_PULSE = "01"


class EPrimarySideControlStatus(Enum):
    ACCESS = "0"  # 接入
    OPEN_CIRCUIT = "1"  # 开路
    SHORT_CIRCUIT = "2"  # 短路
    HIGH_RESISTANCE = "3"  # 高阻


class ESecondarySideControlStatus(Enum):
    ACCESS = "0"  # 接入
    OPEN_CIRCUIT = "1"  # 开路
    SHORT_CIRCUIT = "2"  # 短路
    SERIALLY_CONNECTED = "3"  # 高阻


class ECommMode(Enum):
    RS485_1 = 1
    RS485_2 = 2
    RJ45_1 = 3
    RJ45_1_RS485_3 = 3
    RJ45_1_RS485_4 = 4
    RJ45_2 = 5
    RJ45_2_RS485_5 = 5
    RJ45_2_RS485_6 = 6
    BLUETOOTH = 7
    STA = 8
    CCO = 9


class ETypeProtocol(Enum):
    PROTOCOL_645 = 0
    PROTOCOL_3761 = 1
    PROTOCOL_69845 = 2
    PROTOCOL_3762 = 4
    PROTOCOL_MODBUS = 5

class EPlatformType(Enum):
    # 功能性台体
    Functionality = 0
    # 互换性台体
    Interchangeability = 1


# 设置台体硬压板
class PlatformBoard(Enum):
    # 解除
    enable = 1
    # 恢复
    abandoned = 0


class SwitchStatus(Enum):
    # 合闸
    Connect = 1
    # 开闸
    Close = 0


class HardPressingPlate(Enum):
    """
        硬压板状态：
        0 解除
        1 恢复
    """
    Relieve = 0
    Recovery = 1